package com.blog.cloud.api.dto;

import jakarta.validation.constraints.*;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.CreditCardNumber;
import org.hibernate.validator.constraints.URL;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;

@Getter
@Setter
@Accessors(chain = true)
public class OrderDTO implements Serializable {
    @Serial
    private static final long serialVersionUID = 234961389859133490L;

    @NotNull(message = "ID 不能为空")
    @Min(value = 1, message = "ID 必须大于 0")
    private Long id;

    @NotBlank(message = "名称不能为空或空白")
    @Size(min = 3, max = 30, message = "名称长度必须介于 3 到 30 个字符之间")
    private String name;

    @Email(message = "电子邮件格式无效")
    private String email;

    @NotBlank(message = "电话号码不能为空")
    @Pattern(regexp = "\\d{3}-\\d{3}-\\d{4}", message = "电话号码必须采用以下格式 ###-###-####")
    private String phoneNumber;

    @Min(value = 18, message = "年龄必须年满 18 岁")
    @Max(value = 100, message = "年龄不能超过 100 岁")
    private Integer age;

    @Positive(message = "数量必须为正数")
    private int quantity;

    @DecimalMin(value = "10.0", message = "价格必须至少为 10.0 元")
    @DecimalMax(value = "100.0", message = "价格不能超过 100.0 元")
    private BigDecimal price;

    @Past(message = "出生日期必须为过去日期")
    private LocalDate birthdate;

    @Future(message = "日期必须为未来日期")
    private LocalDate futureDate;

    @URL(message = "URL 格式无效")
    private String website;

    @CreditCardNumber(message = "无效的信用卡号格式")
    private String creditCardNumber;

    @NotNull(message = "性别不能为空")
    private Gender gender;

    public enum Gender {
        MALE, FEMALE, OTHER
    }
}

// DTO（Data Transfer Object）是一种输入型数据对象，用于在应用程序中传递数据。常作为参数传递。
// 关于数据校验的使用参考 SpringBoot 官方文档： https://docs.spring.io/spring-boot/reference/io/validation.html
// 控制器中的使用：通过 @Valid（方法参数实体前）或 @Validated（类上）注解可以自动验证对象，并在验证失败时捕获错误信息。